function compileReg(s, quantifier = 'ug') {
    return eval(`/${s}/${quantifier}`)
}

function completeMode(s) {
    return '^' + s + '$'
}

function regOneMore(s) {
    return `(?:${s})+`
}
function regOneMore2(s) {
    return `(?:${s})+?`
}

function regMore(s, min, max) {
    return `(?:${s}){${min},${max}}`
}

function regCapture(s, name) {
    return `(?<${name}>${s})`
}

function regSeq(...sList) {
    const s = sList.join('')
    return `(?:${s})`
}

function regOr(...sList) {
    const s = sList.join('|')
    return `(?:${s})`
}

function regBackref(n) {
    return `\\${n}`
}


function regNonGreedy(s) {
    return `${s}?`
}

function regJoin(sep, s) {
    return regOr(regSeq(regOneMore(regSeq(s, sep)), s), s)
}


let hanReg = '\\p{Unified_Ideograph}' //汉字
let alphaReg = '[a-zA-Z]'  //字母
let numberReg = '[0-9ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ]'  //数字


module.exports = {compileReg, completeMode, regOneMore, regOneMore2, regMore, regCapture, regSeq, regOr, regBackref, regNonGreedy, regJoin, hanReg, alphaReg, numberReg}

// 先匹配简单的型号，如ENT, 40800001, P20
// 复合简单型号如5cm×7cm, 80mm×100mm, Trackit-24/8, ORS-23-01，Trackit/a 
// 再匹配英文短语如：Compact Sigma，可考虑带括号的 如：ZL-CS-1（70mm×70mm）
// 再匹配带分隔符的英文短语






// let unitSep = '[\\/每]'  //复合单位的分隔符

// // 英文单位
// let baseEngUnit = regMore(alphaReg, 1, 5)
// // 中文单位
// let baseHanUnit = regMore(hanReg, 1, 3)
// // 复合单位
// let complexUnit = regJoin(unitSep, regOr(baseEngUnit, baseHanUnit))

// // 规格 数字+单位 如：70mm
// let specUnit = regSeq(regOneMore(numberReg), complexUnit)
// // 规格 如：70mm*20mm 5cm×7cm
// let specUnitCx = regJoin(regOr('×', '\\*'), specUnit)
// // 规格 简单数字或字母型 如：ENT, 40800001, P20。 (这种规格需要带上完整模式)
// let enSpec = regOneMore(regOr(alphaReg, numberReg))
// // 规格 带空格的（可能会冲突）
// let enSpecSp = regJoin(" ", enSpec)
// // 规格，带分隔符的简单型 如：ORS-23-01, Trackit-24/8
// let enSpecPlus = regJoin(regOr('-', '\\/'), enSpec)
// // 规格，中文型 (这种规格需要带上完整模式)
// let cnSpec = regMore(hanReg, 1, 10)
// // 规格，中文型plus，有数字和字母的(这种规格需要带上完整模式)
// let cnSpecPlus = regMore(regOr(hanReg, alphaReg, numberReg), 1, 15)
// // 规格，中文型plus，带分隔符
// let cnspecPlusSep = regJoin(regOr('-', '—'), cnSpecPlus)


// [..."SUC,dasd,sdf,fasd".matchAll(/\w+/g)]

// [..."SUC-CB-2型".matchAll(compileReg(spec7, 'ug'))]
// [..."便携Ⅱ型".matchAll(compileReg(spec7, 'ug'))]
// [..."Trackit-24/a".matchAll(compileReg(spec4, 'ug'))]
// [..."Trackit-24/8".matchAll(compileReg(spec4, 'ug'))]
// [..."408-00001".matchAll(compileReg(spec4, 'ug'))]
// [..."40800001".matchAll(compileReg(spec3, 'ug'))]
// [..."4080 0001".matchAll(compileReg(spec3, 'ug'))]
// [..."aaa70mm*20mm ff".matchAll(compileReg(spec2, 'ug'))]
// [..."aaa5cm×7cm ff".matchAll(compileReg(spec2, 'ug'))]



// let sunit = 'cm'
// [...sunit.matchAll(compileReg(baseEngUnit, 'g'))]

// let zhUnit = '个'
// [...zhUnit.matchAll(compileReg(baseHanUnit, 'ug'))]

// let comUnit = 'kg/个'
// [...comUnit.matchAll(compileReg(complexUnit, 'ug'))]

// [..."asd10g".matchAll(compileReg(spec1, 'ug'))]
// [..."asd10g每个".matchAll(compileReg(spec1, 'ug'))]
// [..."70mm".matchAll(compileReg(spec1, 'ug'))]



// let sss = 'asdas,ddd,gfsdfg'
// let reg = compileReg(regJoin(',', regOneMore(alphaReg)))
// [...sss.matchAll(/([a-zA-Z]+),?/g)]
// [...sss.match(/(?:([a-zA-Z]+?),?)+/)]
// [...sss.matchAll(/(?:([a-zA-Z]+),?)+/g)]

// [...sss.matchAll(reg)]




// compileReg(
//     completeMode(
//      regSeq(
//          regCapture(regSeq(regOneMore2(hanReg), regCapture(regOneMore2(hanReg)))),
//          regOneMore(regCapture(regSeq(regOneMore2(hanReg), regBackref(2))))
//      )
//     )
// ).exec('普通型冰枕型床垫型颈部专用型关节专用型')


// compileReg(
//     completeMode(
//      regSeq(
//          regCapture(regSeq(regNonGreedy(regOneMore(hanReg)), regCapture(regNonGreedy(regOneMore(hanReg))))),
//          regNonGreedy(regOneMore(regCapture(regSeq(regOneMore(hanReg), regBackref(2)))))
//      )
//     )
// ).exec('普通型冰枕型床垫型颈部专用型关节专用型')

// compileReg(completeMode(regOneMore(hanReg))).exec('普通型冰枕型床垫型颈部专用型关节专用型')
// compileReg(hanReg).exec('普通型冰枕型床垫型颈部专用型关节专用型')
// compileReg(hanReg).exec('aaaa')
// compileReg(hanReg).exec('a,.。，个')

// let regStr = '/([a-z]{3}[1-9]{3})\\1+/'
// let reg = eval(regStr)
// var str = "普通型冰枕型床垫型颈部专用型关节专用型"


// reg.exec(str)
